Реализовать интерпретатор текстовых файлов, описывающих команды над 2D фигурами.

Набор команд:

```
create circle <id> <color_red> <color_green> <color_blue> <x> <y> <radius>
 добавить окружность в сцену
  <id> - идентификатор, целое число
  <color_red> - красный компонент цвета, число от 0 до 255
  <color_green> - зелёный компонент цвета, число от 0 до 255
  <color_blue> - синий компонент цвета, число от 0 до 255
  <x>, <y> - координаты центра, вещественные числа
  <radius> - радиус, вещественное число

create rectangle <id> <color_red> <color_green> <color_blue> <x> <y> <w> <h>
 добавить прямоугольник в сцену
  <id> - идентификатор, целое число
  <color_red> - красный компонент цвета, число от 0 до 255
  <color_green> - зелёный компонент цвета, число от 0 до 255
  <color_blue> - синий компонент цвета, число от 0 до 255
  <x>, <y> - координаты левого нижнего края, вещественные числа
  <w>, <h> - ширина и высота, вещественные числа

create square <id> <color_red> <color_green> <color_blue> <x> <y> <side>
 добавить квадрат в сцену
  <id> - идентификатор, целое число
  <color_red> - красный компонент цвета, число от 0 до 255
  <color_green> - зелёный компонент цвета, число от 0 до 255
  <color_blue> - синий компонент цвета, число от 0 до 255
  <x>, <y> - координаты левого нижнего края, вещественные числа
  <side> - сторона квадрата, вещественное число

create triangle <id> <color_red> <color_green> <color_blue> <x> <y> <a> <b>
 добавить прямоугольный треугольник - левую нижнюю часть прямоугольника - в сцену
  <id> - идентификатор, целое число
  <color_red> - красный компонент цвета, число от 0 до 255
  <color_green> - зелёный компонент цвета, число от 0 до 255
  <color_blue> - синий компонент цвета, число от 0 до 255
  <x>, <y> - координаты левого нижнего края, вещественные числа
  <a>, <b> - катеты треугольника, вещественные числа

set color <id> <color_red> <color_green> <color_blue>
 установить цвет у объекта по идентификатору
  <id> - идентификатор, целое число
  <color_red> - красный компонент цвета, число от 0 до 255
  <color_green> - зелёный компонент цвета, число от 0 до 255
  <color_blue> - синий компонент цвета, число от 0 до 255
 если объекта с таким идентификатором нет в сцене,
 программа должна закончиться с ошибкой

move <id> <dx> <dy>
 переместить объект вправо по идентификатору
  <id> - идентификатор, целое число
  <dx>, <dy> - смещение, вещественные числа
 если объекта с таким идентификатором нет в сцене,
 программа должна закончиться с ошибкой

scale <id> <scale>
 масштабировать размер объекта по идентификатору.
 масштабирование должно идти от центра масс объекта.
 масштабируются линейные размеры (для окружности - радиус, для треугольника / квадрата - все стороны)
  <id> - идентификатор, целое число
  <scale> - множитель масштаба, вещественное число > 0
 если объекта с таким идентификатором нет в сцене,
 программа должна закончиться с ошибкой.
 если scale <= 0, программа должна закончиться с ошибкой

bring to back <id>
 поместить объект за всеми остальными по идентификатору
  <id> - идентификатор, целое число

bring to front <id>
 поместить объект перед всеми остальными по идентификатору
  <id> - идентификатор, целое число
 если объекта с таким идентификатором нет в сцене,
 программа должна закончиться с ошибкой.

draw <filename> <scene_x> <scene_y> <scene_w> <scene_h> <width> <height>
 Отрендерить сцену в файл в формате .ppm (P3)
  <filename> - имя файла, куда сохраняется сцена, строка
  <scene_x>, <scene_y> - координаты левого нижнего края рисуемого куска сцены, вещественные числа
  <scene_w>, <scene_h> - ширина и высота рисуемого куска сцены, вещественные числа
  <width>, <height> - ширина и высота картинки, целые числа
 Картинка состоит из <width> * <height> пикселей.
 Рендеринг вычисляет цвет каждого пикселя:
 чёрный, если этот пиксель не закрывает ни один из объектов или
 цвет верхнего из объектов, закрывающих этот пиксель.
```

* Каждый новый объект по умолчанию поверх всех остальных.
* Считать, что пиксель закрывает объект, если центр пикселя закрыт объектом.
* Погрешности перевода из вещественных чисел в целые игнорируйте.
* Если при создании объекта объект с таким id уже существует, программа должна завершиться с ошибкой.
* Если приходят некорректные данные (отрицательный радиус, несуществующий цвет) - программа должна завершиться с ошибкой.
* В случае, если программа завершается с ошибкой, в `std::cerr` нужно напечатать, какая команда породила ошибку и почему (отрицательный радиус, зарезервированный идентификатор, несуществующий цвет и т.д.)
* Некорректная команда должна останавливать работу интерпретатора с ошибкой.
* Значения в команде могут быть разделены произвольным числом пробелов и табуляций (>= 1)
* Считается, что одна команда располагается на одной строчке в файле команд
* Для простоты реализации разрешается считывать из файла без буферизации на стороне приложения.
* про формат ppm (P3) можно почитать тут: https://en.wikipedia.org/wiki/Netpbm#File_formats

Запуск интерпретатора:

```
./interpreter.exe commands_list.txt
```

Для визуальной отладки можно конвертировать ppm файлы в png. Под ubuntu можно, например, воспользоваться программой imagemagick.

Установка:

```
sudo apt-get install imagemagick
```

Конвертация:

```
convert mypicture.ppm mypicture.png
```

